package category

import (
	models "HeadLineNews/proto_models/manage/category_model"
	"HeadLineNews/resp"
	"github.com/gin-gonic/gin"
)

type Server interface {
	AddCategoryHandler(c *gin.Context)
	UpdateCategoryHandler(c *gin.Context)

	RetrieveCategoryHandler(c *gin.Context)
	ListCategoryHandler(c *gin.Context)
}

type server struct {
	ctx  Ctx
	repo Repo
}

func NewServer() Server {
	return &server{
		ctx:  NewCtx(),
		repo: NewRepo(),
	}
}

// AddCategoryHandler 新增分类
func (s *server) AddCategoryHandler(c *gin.Context) {
	p, err := s.ctx.ParseParamAddCategory(c)
	if err != nil {
		return
	}
	if err = s.repo.CheckUniqueCategoryName(c, p.CategoryName); err != nil {
		return
	}
	if err = s.repo.InsertCategory(c, p); err != nil {
		return
	}
	resp.Success(c, nil)
}

// UpdateCategoryHandler 更新分类
func (s *server) UpdateCategoryHandler(c *gin.Context) {
	// 解析参数
	p, err := s.ctx.ParseParamUpdateCategory(c)
	if err != nil {
		return
	}
	// 查询分类名
	var categoryName string
	if categoryName, err = s.repo.CheckCategoryExists(c, p.CategoryId); err != nil {
		return
	}
	// 检查更新分类名唯一
	if categoryName != p.CategoryName {
		if err = s.repo.CheckUniqueCategoryName(c, p.CategoryName); err != nil {
			return
		}
	}
	// 更新
	if err = s.repo.UpdateCategory(c, p); err != nil {
		return
	}
	resp.Success(c, nil)
}

// RetrieveCategoryHandler 检索单条分类
func (s *server) RetrieveCategoryHandler(c *gin.Context) {
	p, err := s.repo.RetrieveCategory(c)
	if err != nil {
		return
	}
	resp.Success(c, p)
}

// ListCategoryHandler 批量展示作者
func (s *server) ListCategoryHandler(c *gin.Context) {
	// 解析参数
	p, err := s.ctx.ParseParamListCategory(c)
	if err != nil {
		return
	}
	// 查询
	var data *models.ResponseListCategory
	if data, err = s.repo.ListCategory(c, p); err != nil {
		return
	}
	//
	resp.Success(c, data)
}